/* Start.s 
 *	Assembly language assist for user programs running on top of Nachos.
 *
 *	Since we don't want to pull in the entire C library, we define
 *	what we need for a user program here, namely Start and the system
 *	calls.
 */

#define IN_ASM
#include "syscall.h"

        .text   
        .align  2

/* -------------------------------------------------------------
 * __start
 *	Initialize running a C program, by calling "main". 
 *
 * 	NOTE: This has to be first, so that it gets loaded at location 0.
 *	The Nachos kernel always starts a program by jumping to location 0.
 * -------------------------------------------------------------
 */

	.globl __start
	.ent	__start
__start:
	jal	main
	move	$4,$0		
	jal	Exit	 /* if we return from main, exit(0) */
	.end __start

/* -------------------------------------------------------------
 * System call stubs:
 *	Assembly language assist to make system calls to the Nachos kernel.
 *	There is one stub per system call, that places the code for the
 *	system call into register r2, and leaves the arguments to the
 *	system call alone (in other words, arg1 is in r4, arg2 is 
 *	in r5, arg3 is in r6, arg4 is in r7)
 *
 * 	The return value is in r2. This follows the standard C calling
 * 	convention on the MIPS.
 * -------------------------------------------------------------
 */

	.globl Halt
	.ent	Halt
Halt:
	addiu $2,$0,SC_Halt
	syscall
	j	$31
	.end Halt

	.globl Exit
	.ent	Exit
Exit:
	addiu $2,$0,SC_Exit
	syscall
	j	$31
	.end Exit

	.globl Exec
	.ent	Exec
Exec:
	addiu $2,$0,SC_Exec
	syscall
	j	$31
	.end Exec

	.globl Join
	.ent	Join
Join:
	addiu $2,$0,SC_Join
	syscall
	j	$31
	.end Join

	.globl Create
	.ent	Create
Create:
	addiu $2,$0,SC_Create
	syscall
	j	$31
	.end Create

	.globl Open
	.ent	Open
Open:
	addiu $2,$0,SC_Open
	syscall
	j	$31
	.end Open

	.globl Read
	.ent	Read
Read:
	addiu $2,$0,SC_Read
	syscall
	j	$31
	.end Read

	.globl Write
	.ent	Write
Write:
	addiu $2,$0,SC_Write
	syscall
	j	$31
	.end Write

	.globl Close
	.ent	Close
Close:
	addiu $2,$0,SC_Close
	syscall
	j	$31
	.end Close

	.globl Fork
	.ent	Fork
Fork:
	addiu $2,$0,SC_Fork
	syscall
	j	$31
	.end Fork

	.globl Yield
	.ent	Yield
Yield:
	addiu $2,$0,SC_Yield
	syscall
	j	$31
	.end Yield
	
	.globl CreateLock
	.ent	CreateLock
CreateLock:
	addiu $2,$0,SC_CreateLock
	syscall
	j	$31
	.end CreateLock
	
	.globl CreateCV
	.ent	CreateCV
CreateCV:
	addiu $2,$0,SC_CreateCV
	syscall
	j	$31
	.end CreateCV
	
	.globl LockAcquire
	.ent	LockAcquire
LockAcquire:
	addiu $2,$0,SC_Acquire
	syscall
	j	$31
	.end LockAcquire

	.globl LockRelease
	.ent	LockRelease
LockRelease:
	addiu $2,$0,SC_Release
	syscall
	j	$31
	.end LockRelease
	
	.globl CVSignal
	.ent	CVSignal
CVSignal:
	addiu $2,$0,SC_Signal
	syscall
	j	$31
	.end CVSignal

	.globl CVWait
	.ent	CVWait
CVWait:
	addiu $2,$0,SC_Wait
	syscall
	j	$31
	.end CVWait
	
	.globl CVBroadcast
	.ent	CVBroadcast
CVBroadcast:
	addiu $2,$0,SC_Broadcast
	syscall
	j	$31
	.end CVBroadcast

	.globl LockDestroy
	.ent	LockDestroy
LockDestroy:
	addiu $2,$0,SC_DestroyLock
	syscall
	j	$31
	.end LockDestroy
	
	.globl CVDestroy
	.ent	CVDestroy
CVDestroy:
	addiu $2,$0,SC_DestroyCV
	syscall
	j	$31
	.end CVDestroy
		
	.globl SWrite
	.ent	SWrite
SWrite:
	addiu $2,$0,SC_SWrite
	syscall
	j	$31
	.end SWrite
	
	.globl ToString
	.ent	ToString
ToString:
	addiu $2,$0,SC_ToString
	syscall
	j	$31
	.end ToString

	.globl Append
	.ent	Append
Append:
	addiu $2,$0,SC_Append
	syscall
	j	$31
	.end Append
	
	.globl Rand
	.ent	Rand
Rand:
	addiu $2,$0,SC_Rand
	syscall
	j	$31
	.end Rand

	.globl CreateIntMV
	.ent	CreateIntMV
CreateIntMV:
	addiu $2,$0,SC_CreateIntMV
	syscall
	j	$31
	.end CreateIntMV

	.globl AlterIntMV
	.ent	AlterIntMV
AlterIntMV:
	addiu $2,$0,SC_AlterIntMV
	syscall
	j	$31
	.end AlterIntMV

	.globl RetrieveIntMV
	.ent	RetrieveIntMV
RetrieveIntMV:
	addiu $2,$0,SC_RetrieveIntMV
	syscall
	j	$31
	.end RetrieveIntMV

	.globl DestroyIntMV
	.ent	DestroyIntMV
DestroyIntMV:
	addiu $2,$0,SC_DestroyIntMV
	syscall
	j	$31
	.end DestroyIntMV
	
	.globl WriteAll
	.ent	WriteAll
WriteAll:
	addiu $2,$0,SC_WriteAll
	syscall
	j	$31
	.end SWriteAll



/* dummy function to keep gcc happy */
        .globl  __main
        .ent    __main
__main:
        j       $31
        .end    __main

